/* eslint-disable no-undef */
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import VueRouter from 'vue-router';
import store from './store';

// 引入常量
import * as CDATA from './constant';
// 引入工具函数
import * as tools from './utils/tools.js';
// 正则
import * as reg from './utils/reg';
// lodash
import _ from 'lodash';
// 引入es6-promise，解决IE不支持的问题
import Es6Promise from 'es6-promise';
// rem
import '@/utils/rem';
// 初始化css
import '@/assets/css/base.less';
// 引入animate.css
import 'animate.css/animate.css';
// 全局样式
import '@/assets/css/common.less';
import '@/assets/css/easy.less';
// 字体图标
import '@/assets/css/icon-font.less';
// 注册全局过滤器
import * as filter from '@/filters';
// vue-quill-editor富文本编辑器
import VueQuillEditor from 'vue-quill-editor';
// 请求文件
import api from './api';
// 加载进度条
import NProgress from 'nprogress';
// 加载进度条原样式
import 'nprogress/nprogress.css';
// 加载条自定义样式
import '@/assets/css/nprogress.less';
// md5
import md5 from 'js-md5';
// CryptoJs
import CryptoJs from 'crypto-js';
// 混入
import Mixin from '@/mixins/mixins';
import VueDND from 'awe-dnd';

import 'element-ui/lib/theme-chalk/base.css';

// 自定义指令
import loadMore from '@/directive/load-more';
import dcp from '@/directive/disabled-copy-paste';

Vue.config.devtools = true;

// =================================================  注册

Vue.prototype.CDATA = CDATA;
Vue.prototype.tools = tools;
Vue.prototype.reg = reg;
Vue.prototype._ = _;
Es6Promise.polyfill();
Vue.prototype.$md5 = md5;
Vue.prototype.$crypto = CryptoJs;
Vue.mixin(Mixin);
Vue.use(VueDND);

// 导出一个对象，循环注册在vue上
Object.keys(filter).forEach(key => {
  Vue.filter(key, filter[key]);
});
Vue.use(VueQuillEditor);
// 请求文件
Vue.prototype.$api = api;
// 进度条配置
NProgress.configure({
  easing: 'ease', // 动画方式
  speed: 500, // 递增进度条的速度
  showSpinner: true, // 是否显示加载ico
  trickleSpeed: 200, // 自动递增间隔
  minimum: 0.3 // 初始化时的最小百分比
});

Vue.use(loadMore);
Vue.use(dcp);

// ===============================================  路由拦截器
router.beforeEach((to, from, next) => {
  NProgress.start();

  // 进登录页面时
  if (to.path === '/login') {
    // local中有用户名时，禁止跳转登录页面
    if (sessionStorage.getItem('user')) {
      next({
        path: '/'
      });
    }
  } else {
    next();
  }

  // 判断local中是否存在用户名
  if (sessionStorage.getItem('user')) {
    // 存在可以跳转
    next();
  } else {
    if (to.path === '/login') {
      next();
    } else {
      next({
        path: '/login',
        query: {
          redirect: to.path
        }
      });
    }
  }

  next();
});

router.afterEach((to, from) => {
  if (to.meta.name) {
    window.document.title = `${to.meta.name} / ${CDATA.PROJECT_TITLE}`;
  } else {
    window.document.title = `${CDATA.PROJECT_TITLE}`;
  }

  NProgress.done();
});

// 防止用户手动更改local
window.addEventListener('storage', function(e) {
  console.log(e);
  if (e.newValue !== e.oldValue || e.newValue === null) {
    Vue.prototype.$notify.error({
      title: '非法操作',
      message: '请重新登录'
    });
    store.commit('logout', '');
  }
});


// 按需加载element-UI
import {
  Notification,
  MessageBox,
  Form,
  FormItem,
  Input,
  Autocomplete,
  Select,
  Option,
  OptionGroup,
  Radio,
  CheckboxGroup,
  Checkbox,
  Container,
  Aside,
  Header,
  Footer,
  Main,
  Menu,
  Submenu,
  MenuItem,
  MenuItemGroup,
  Popover,
  Dialog,
  Tree,
  Loading,
  Table,
  TableColumn,
  Pagination,
  Tabs,
  TabPane,
  RadioButton,
  RadioGroup,
  Upload,
  Cascader,
  Image,
  Card,
  Divider,
  Tooltip,
  Dropdown,
  DropdownItem,
  DropdownMenu,
  Timeline,
  TimelineItem,
  DatePicker,
  TimeSelect,
  TimePicker,
  InfiniteScroll,
  Avatar,
  Scrollbar
} from 'element-ui';

Vue.use(Form);
Vue.use(FormItem);
Vue.use(Input);
Vue.use(Autocomplete);
Vue.use(Select);
Vue.use(Option);
Vue.use(OptionGroup);
Vue.use(Radio);
Vue.use(CheckboxGroup);
Vue.use(Checkbox);
Vue.use(Container);
Vue.use(Aside);
Vue.use(Header);
Vue.use(Footer);
Vue.use(Main);
Vue.use(Menu);
Vue.use(Submenu);
Vue.use(MenuItem);
Vue.use(MenuItemGroup);
Vue.use(Popover);
Vue.use(Dialog);
Vue.use(Tree);
Vue.use(Table);
Vue.use(TableColumn);
Vue.use(Pagination);
Vue.use(Tabs);
Vue.use(TabPane);
Vue.use(RadioGroup);
Vue.use(RadioButton);
Vue.use(Loading.directive);
Vue.use(Upload);
Vue.use(Cascader);
Vue.use(Image);
Vue.use(Card);
Vue.use(Divider);
Vue.use(Tooltip);
Vue.use(Dropdown);
Vue.use(DropdownItem);
Vue.use(DropdownMenu);
Vue.use(Timeline);
Vue.use(TimelineItem);
Vue.use(DatePicker);
Vue.use(TimeSelect);
Vue.use(TimePicker);
Vue.use(InfiniteScroll);
Vue.use(Avatar);
Vue.use(Scrollbar);
Vue.prototype.$notify = Notification;
Vue.prototype.$confirm = MessageBox.confirm;
import 'element-ui/lib/theme-chalk/base.css';


// 按需加载antd
import {
  message,
  Button,
  Breadcrumb,
  Modal,
  Drawer,
  Alert,
  Steps,
  Result
} from 'ant-design-vue';

Vue.use(Button);
Vue.use(Breadcrumb);
Vue.use(Modal);
Vue.use(Drawer);
Vue.use(Alert);
Vue.use(Steps);
Vue.use(Result);
Vue.prototype.$confirm = Modal.confirm;
Vue.prototype.$message = message;


// 是否显示生产模式的消息
Vue.config.productionTip = false;
// 生产模式不显示调试插件
Vue.config.devtools = process.env.NODE_ENV === 'development';

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');

//  ┏┓　　　┏┓
// ┏┛┻━━━┛┻┓
// ┃　　　　　　　┃
// ┃　　　━　　　┃
// ┃　┳┛　┗┳　┃
// ┃　　　　　　　┃
// ┃　　　┻　　　┃
// ┃　　　　　　　┃
// ┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
